PHPのプログラム再開の後

久々にPHPのプログラムをやっているのですが、その続き。

12月の中ごろから、FindTravelの複数のページの情報をリスト形式で取り出すPHPスクリプトを作成中でした。
PHPで予定してきた機能を単一のページについては予定どおりに作れたので、さっそく、範囲を限定して実行してみました。

ところが、処理が遅すぎて話にありません。
PHPで書いたのが悪いのか、それとも、単一ページの情報を取り出す処理を連続して実行する、というやり方に問題があったか?
これから検討はしますが、10時間くらい実行して2000ページもすすみませんでしした。これでは、3万ページ以上ある FindTravel の情報の極一部しか見れません。

まあ、大規模なサイトをあいてにするのが間違っていたのかもしれません。
これは、このまま終わりにして、別のテーマを探した方がいいかな、と思っています。

...Cで書いて高速で実行した?
やっぱり、DDOS攻撃とみなされて、威力業務妨害で訴えられますよね。

PHPのスクリプト作成中

久々に、PHPのプログラムを作っています。

前に手がけたのは、8月末くらいだったので、ほぼ4ケ月ぶり。さらに、それまでもほとんど作っていなかったので、ブランクはそうとうのもの。
おかげで、関数はネットでいちいち調べないと解らない状態だし、配列の使い方はマニュアルを読み直してやっと作っている状態。

まあ、凝ったやりかたをしなければ、まだ、なんとかなるかな、という感触です。

今、手がけているは、FindTravel の記事の一覧を作ってみよう、と思ったことが原因でした。FindTravel の記事は、URLが番号を振っただけなので、簡単に全データをとりだせそう、と思ったからです。

FindTravel では、同じ施設がいくつもの記事で紹介されており、作成した人によって紹介の詳しさに差があるので、1つの記事を読んだだけでは、そのよさが解らない。

他のサイトの口コミも、詳しい人をあっさり書く人の差が大きいので、いい口コミに当たらないと、参考にならないことが多い。その点はいっしょなのだが、FindTravel では1つ施設の紹介文が複数の記事に書かれていることがあるので、まとめて見ようと思うとかなり不便。(同じような施設を比べるのにはいいのですが)

だったら、同じ施設を紹介した記事のリストを作って、そのリストを基に見てみようか、と思いたちました。

昔はスクリプトでの文字列の加工は得意だったのですが、今では…
とりあえず、基本形ができたので、数例で確認中。
以外と、FindTravel は自由に書けるようで、うまく情報を取り出せてません。

年末年始休暇には、全件を取り出して、どれくらいのデータが登録されているかも解るかも、なんて思ってますが、業務妨害にならないようにデータを取り出すとすると、かなり時間がかかりそう。

はたして、うまくいくのか。

派遣の仕事の更新時期

今やっている工場の派遣の仕事ですが、いっしょに入った多くの人が11月末までだったそうで、何人かが12月も延長になっていました。私もその延長組に入っていたのですが、どうも12月末で終わりのようです。

工場の派遣が、こんなに短いというのは知りませんでした。

以前の会社にいた派遣の技術者は、3年くらいは継続していたと思うし、辞めるのも自分の都合で、もっと残ってほしかったと言われたくらい。
まあ、請負で1ケ月だけ、という技術者もいたのですが、請負の場合はいつでもその人と電話で話ができるような状態で、完全に切れることはありませんでした。

でも、工場の場合は、1ケ月だけ作業したら次の職場、というもありみたいで、何年も派遣の仕事をやっている人は、当然、という感じで次の仕事を探すと言ってました。

1月からの仕事については、派遣会社の営業が持っている仕事を紹介してくれるよう、お願いしておいたのですが、こんなに短いと正直、仕事を覚えられず時給分の作業ができなかったのでは、と心配になります。さらに次の仕事があるのか、また自分にやれることかとか、心配ですし。

今、作業している内容は、慣れるまで2週間くらいかかり、順調にやれるようになるまで1ケ月かかりました。特に、最初の1週間は、作成できる製品が少ないうえ、すぐに不良を出してしまうので、絶対赤字だったと思います。
期間が短いと、なかなか仲間という感情も生まれないし。

まあ、派遣の評判が悪いのは、この辺もあるのかな。

派遣の仕事

工場の派遣労働者になって、1ケ月経ちました。
まだ慣れません。工場の仕事ってこんな疲れるんだ、と筋肉痛の日々に苦闘してます。

しかも夜勤に切り替わりました。午後5時から深夜2時までの遅番ですが、なかなか眠いし、日中は寝れないしで、慣れません。

しばらくは、こういう生活ですね。

パソコンを使った在宅ワーク

ほぼ1ケ月前から、クラウドワークスのパソコンを使った在宅ワークをやっている。
発注者の指定したテーマに沿って、インターネットで調べて記事を作成し、それを納品するという、まあ誰にでもできる内容にはなっている。

しかし、インターネットで調べて、というのが以外と難しい。ほぼ1ケ月くらいやった感じでは、

(1) テーマに書く対象をインターネットで調べてリストアップする。
(2) リストアップした対象をインターネットで調べる。
(3) テーマに合わせて文章を書く。

の3つのステップになるかと思う。

最初は、何を調べていいのか解らず、手当たり次第ネットで調べていたので、かなり時間がかかってしまった。時間をかけずにワークを仕上げるには、こういうことだと思う。

1.調べるサイトを、少数に絞る。
2.調べるサイトに書かれたことだけで、記事を作る。
3.記事作成のルールを吟味して、それに指定されたことだけ調べて書く。

そこで重要なのは、どのサイトを調べるか。これで、記事を作成する時間が決まってしまう。例えば、読む内容が多ければ、それだけ調べるのに時間がかかる。実際に書く内容がきちんとまとまっているサイトがベスト。しかし、そんな便利なサイトはなかなか無いんですよね。

インターネットを調べていると、キュレーション・サイトがよくヒットします。こういうのを参考にして書くことが多いのですが、けっこう記事の品質にばらつきがある。いい記事にあたると、簡単に掛けてしまうのに、いい記事が見つからないと、いろんはサイトから情報を持ってくることに。

こういう作業で、毎月数万円も稼いでいる人もいるみたいなんで、今のところ、なんとか技術を習得して、家計の足しにしたい。と思ってがんばっているところです。

しかし、問題が。
これはプログラムの技能がなくてもできること。自分にとって有効なスキルアップなのか?

とはいえ、世の中のサイトを見て回れると思って、前向きにやってます。

amazonで本のランキング

楽天ブックスは、APIを使うのと楽天ブックスのWebで検索すると違う?
じゃ、アマゾンは、と思い、確認してみた。

アマゾンのAPIは、今年の1月にちょっと調べてそれっきりになっていた。
amazon api のその後
しかも、URLを作るだけで、データを取得してもいない。単に、XMLを表示するだけ。

しょうがいないので、これでパラメータとか確認してみました。

アマゾンでのAPIは、Sort に、salesrank を指定したのと、アマゾンのWeb画面で、本だけにして、「注目度」で検索に結果と同じでした。Sort のキーワード salesrank が、なんで「注目度」なのかはよくわらんが。

じゃ、楽天ブックスは、というと、これから調べます。

楽天ブックスのAPIを使う(その2)

楽天ブックスのAPIを使ってのPHPプログラムです。
昨日、別のAPIを使う必要があると解り、今日、さっそく作りました。
(趣味でやっているプログラムなので、土日休みだと、2日続けてやれます。)

使ったのは「楽天ブックス総合検索API」
楽天ブックス総合検索API

こっちは、検索のキーワードが、楽天市場商品検索と同じ keyword になります。
また、昨日使った楽天ブックス書籍検索とは、出力データが違うので手を入れる必要がありました。

keyword に「PHP」を含む、ジャンルが「パソコン・システム開発」と思われる本は、80件が該当しました。それを、CSV形式でとりあえず画面に表示する、PHPのバッチ用スクリプトにしました。
まだ評価段階なので、Webページにはしてません。

作成したのは、次の3つ。
config.php : 楽天APIにアクセスするためのIDを格納するファイル
専用のクラスを記載したファイル
実行用のPHPファイル

まず、config.php は、楽天APIのサイトからダウンロードできるサンプルを同じしてます。
次に、クラス記述したファイルは、こんなのにしました。
Webサイトにデータを表示する処理は、まだ作ってません。これから追加するつもりです。

rwsclient = new RakutenRws_Client();
    if(! $this->rwsclient ) {
      echo "RakutenRws_Client クラスの生成に失敗しました\n";
      exit;
    }
    // アプリIDをセット Set Application ID
    $this->rwsclient->setApplicationId(RAKUTEN_APP_ID);
    // アフィリエイトIDをセット (任意) Set Affiliate ID (Optional)
    $this->rwsclient->setAffiliateId(RAKUTEN_APP_AFFILITE_ID);
  }

  function get_bookdata( $keyword, $page ) {
    if( $this->rwsclient === null ) {
      $this->initalize();
    }
    try {
      $response = $this->rwsclient->execute( $this->rakuten_app, array(
      'keyword'   => $keyword,
      'booksGenreId'   => "001005005006",
      'page'    => $page,
      'hits'    => 30,
      'sort'    => 'sales'
      ));
      return( $response );
    } catch(Exception $e) {
      echo "Client execute error :", $e->getMessage(), "\n";
      exit;
    }
  }

  function data_store( $response ) {
    foreach( $response as $item ) {
      for( $i=0; $i < count($this->books_t); $i++ ) {
        $this->books_datas[$this->books_count][$this->books_t[$i]] = htmlspecialchars(mb_strimwidth($item[$this->books_t[$i]], 0, 80, '...', 'UTF-8'));

// echo "Debug: ", $this->books_count, " : ", $i, " : ", $this->books_t[$i], " : ", $this->books_datas[$this->books_count][$this->books_t[$i]] , "\n";
      }
      $this->books_count++;
    }
  }

  function data_dump() {
    echo "title,subTitle,author,publisherName,size,isbn,itemUrl\n";
    for( $i=0; $i < count($this->books_datas); $i++ ) {
      for( $j=0; $j < count($this->books_t); $j++ ) {
        if( $j > 0 ) {
          echo ",";
        }
        echo $this->books_datas[$i][$this->books_t[$j]];
      }
      echo "\n";
    }
  }
}

そして、テスト用のPHP実行用ファイル。

initalize();
$page_count = 1;
for( $i=1; $i <= $page_count; $i++ ) {
  $response = $bs->get_bookdata( $keyword, $i );
  if( $response && $response->isOK() ) {
    $bs->data_store( $response );
    if( $page_count == 1 ) {
      $page_count = $response['pageCount'];
    }
  }
}
// 検索した結果を画面に表示します。
$bs->data_dump();
?>

なにせ、1ページに30件、という制限があるので、すべて取り出すには、全ページにアクセスして、まとめて表示することになります。

結果を楽天ブックスの実際の画面と比べてみると、なんか違う。
なんで、違っているかは、まだ、確認できてません。まだ何かあるのかも。

楽天ブックスのAPIを使う

楽天には、アフェリエイト用に、商品のデータにアクセスするためのAPIが用意されている。何か、プログラムの題材に使えないのかな、と考えていたのだが、いまいち思いつかない。
実は、楽天ショップの商品には、統一の商品コードが無く、お店が自由に設定できるらしい。そのため、ある商品を検索すると、いろいろな商品名がでてくる。

しかし、本は、共通のコードがあるので、それで管理されているため、ISBNコードにつき必ず1つの本が検索されるらしい。
ということで、本に絞って、特定のキーワードを含む本のランキングを表示するAPIは、おもしろいかもしれない、ということで、今日、調べてみました。

まずはここ。
楽天ウェブサービス:API一覧

そして、楽天ブックスのAPI。
楽天ウェブサービス:楽天ブックス書籍検索API

更に、これも使う。
楽天ウェブサービス:SDK一覧

SDKには、サンプルが付いているので、まずはこれを使って加工する。
でやってみたのだが、なんかうまくいかない。
サンプルの index.php は、エラー処理がかかれていないので、何で出ないのか解らない。
おかげに、SDKのソースを追いかけるはめに。
うまくいかない原因は、引数に何も入っていないから、というオチでした。

順調に表示するようになったのだが、次の問題発生。このAPIは、1ページに表示する本の数が、1から30までに制限されている。
例えば、タイトルに「PHP」を含む本を検索すると、134冊もヒットする。
ヒットした本すべて取り込みたい。
でも、1回目を取り込みしないと、何ページあるかわからない。

じゃ、という訳で、
1回目は普通にAPIを呼び出して、データを格納する。
この時のページ数を控えておく。
ページ数が1より大きい場合は、ループを回して、APIを呼び出し、データを格納の動作をページ分だけ繰り返す。
最後に、CSVにしてファイルに書き出す。

そこまでなんとかできました。
しかし、落としたファイルをよく見ると、PHP出版のプログラムに関係の無い本もふくまれています。
「プログラム言語PHP」の本のランキング、となると、更にジャンルを調べて関係のない本を除く必要が。

ということで、楽天ブックス総合検索APIで、ジャンルまで指定して検索する必要がありました。やりなおし、ということに。
(ジャンルとコードの一覧表を予め作っておく必要があるみたいです。)

Yahoo Api を使ってみる(地図)

今日、Webサイトを調べていたら、あやしい地図を発見した。
Google Map を、何も考えないでWebページに貼り付けると、ルーラーとかのアクセサリが普通に使える。しかし、そのサイトに貼ってあった地図は、アクセサリが付いてなかった。マウスでドラッグすると動くので、画像ではない。どうなっているんだろう、と思い、Yahoo api で作る地図も調べてみよう、と思った。

Yahoo API を使うには
Goggle API とそっくりです。詳しくは、Yahoo で、Yahoo Api を検索すると一番上に出たページを見てください。
YAHOO デベロッパーズ・ネットワーク

サンプルをやってみよう
解り易い例が載ってます。このとおりに作ると、やっぱりアクセサリが出ません。
アクセサリの出し方は、その例の下に使い方が載ってました。

Google Map 風に書き換えるとこんな感じ。

function map_view() {
    var mapopt = {
      configure : {
        doubleClickZoom : false,
        scrollWheelZoom : true,
        singleClickPan : false,
        dragging : true
      }
    };
    var ymap = new Y.Map("map", mapopt);
    var latlng = new Y.LatLng(38.2865544,140.318898);
    ymap.drawMap( latlng, 17, Y.LayerSetId.Normal);

    var control1 = new Y.ScaleControl();
    var control2 = new Y.SliderZoomControlHorizontal();
    ymap.addControl(control1); 
    ymap.addControl(control2); 

    var label1 = new Y.Label( latlng, "株式会社テクノ・サービス 山形営業所" );
    ymap.addFeature( label1 );
}

これは、ここを参照。
YAHOO地図の例

クレジットカードってこんなに便利だったんだ

今ごろですが、クレジットカードがいかに便利かを調べています。

今までは、「クレジットカードを使う」=「借金をする」というイメージが強く、抵抗がありました。
私の両親は、若いころお金で苦労したせいで、借金が嫌いでした。その影響があって、私も借金には抵抗があります。クレジットカードを持ったのは、社会人になってしばらくしてから、いとこからノルマ達成のために作ったのですが、何年も使わずにいたくらいです。

最初に作ったのは「JCB」のカードだったのですが、どうしても「VISA」でのカードによる支払いが必要になり、作ったカードもありますが、やっぱり使う機会がありません。

最初に作ったカードは、「セゾンカード インターナショナル」。
年会費はかかってません。
今は、毎月の支払いとかにも使っているので、少しですがポイントも貯まっています。
しかし、そのポイントを使う方法もよくわからず、そのままにしてました。

今日、YouTubeで、ホリエモンのインタビューを聞いていて、クレジットカードを使うのは借金でもなんでもない。紙幣はそれ自体に価値が無いのに、日本銀行の信用で物と交換ができるだけ。クレジットカードは、クレジット会社の信用で物と交換ができる訳だから、その信用を壊さない範囲で使った方がいい、というのを聞いて、調べることにしました。改めて調べたところ、このカードの特徴である、「永久不滅ポイント」うまく使えば、いろいろとメリットがあることに気がつきました。

1.永久不滅ポイントとは
永久不滅ポイントは、セゾンカードの毎月のご利用合計金額1,000円ごとに1ポイント貯まる仕組みです。
残念ながらキャッシングでは、ポイントは貯まりません。

私は、社会人になってから、ずっと給料を銀行振込でもらっています。最近は、通帳と銀行カードを妻に預けているので、自分でATMからお金を下ろすことはありません。必要なら妻に言うのですが、妻は最低限のお金しか家に置いてないので、クレジットカードのキャッシングを利用する機会が増えていました。

クレジットカードのキャッシングでお金を下ろして、クレジットカードが使えるコンビにとかで買い物して訳で、なんてもったいないことをしていたのか、と悔やんでいます。

2.セゾンカードのポイント増額が利用できるお店は
セゾンカードで使って買い物をすると、通常の何倍ものポイントがもらえる店があることが解りました。
注目すべきは、アマゾンと楽天です。

アマゾンからは、本以外にもいろいろな商品を購入する機会があります。いつもクレジットカードで支払いをしてきたのですが、知らないうちにポイントがついていました。しかし、専用のWebページからアマゾンにアクセスするだけで、2倍から最大7倍ものポイントが付いたかもしれません。
アマゾンを利用する

アマゾンで3倍以上のポイントが付くのは、ファッション関係のみみたいで、私は利用しませんが、2倍のポイントがついて、それを利用できるのであれば、メリットは十分にあると思います。
同様に、楽天も専用のページからアクセスするとクレジットカードでの支払いでポイントが増加します。

他にも、ネットで買い物する場合にポイントが付くものが多いので、クレジットカードの支払いには注意しようと思います。
永久不滅ポイント

3.買い物以外にポイントを貯める方法
永久不滅ポイントのWebページを見ると、買い物以外にもポイントを貯める方法が幾つか用意されています。
・商品アンケートで貯める
 Webのアンケートに答えるだけ
・レシートで貯める
 レシートをデジカメでとって、対象商品を購入した理由を添えて登録するだけ。
・CMを見るだけ
 WebのCMアンケート画面から指定のCMを見るだけ
・ビンゴゲームで貯める
 Webのビンゴゲームに挑戦します

他にもポイントをもらえる方法があるので、自分にできそうなものは挑戦してみたいと思います。
永久不滅のポイント サービスカテゴリ

4.その他にポイントが付くもの
永久不滅ポイントは、クレジットカードで支払いすれば、1000円ごとに1ポイントつく訳なので、実はいろいろな支払いでポイントが付きます。
こんなのでも、ポイントが付くというのがあります。

・自動車税
山形県の場合、yahoo 公金支払いを経由して、クレジットカードでの支払いを利用することができます。
yahoo公金支払いのページ

5.永久不滅ポイントを支払いに使う
貯まったポイントを、クレジットカードの支払いにあてることができます。
ポイントdeお買物

200ポイントを使って、900円分の支払いに当てることができます。
この手続きは自動ではなく、Netアンサーを解して、毎月6日までに交換手続きを行うと、翌月ご請求分から引かれる仕組みになっています。ポイントの残高を見て、手続きすることで、ポイントを有効に使うことができる訳です。

とにかく、今まではクレジットのポイントをあまり考えずに使っていました。これからは、うまく使っていこうと思います。